// 接口
// 接口的面向对象特征：
// 1.接口是比抽象类还要再抽象的概念，在接口中就只能有抽象的属性和方法，相当于就只能声明结构，不能有具体的实现
// 2.接口不能使用访问修饰符
// 3.类和接口的实现使用implements关键字
// 4.接口可以多实现
// 5.接口和接口之间使用extends继承

interface Foo{ 
  name: string;
  get nameGetter(): string;
  method(name: string): string;
}

interface Bar{
  show(addr: string): string;
}

class Baz implements Foo, Bar{
  name = "baz";
  get nameGetter(): string{
    return this.name;
  }
  method(name: string): string{
    return name;
  }
  show(addr: string): string{
    return addr;
  }
}

// 在TS中，接口和类型别名可以有混用的效果
// 在TS中，接口具有声明合并的特性
// 虽然可以合并，但是并不能有冲突，如果出现同键名，但是值不同类型的情况会报错
interface User{
  id: number;
  name: string;
  tel: string;
}
interface User{
  tel: string;
}

interface Person extends User{
  age: number
}

type Action = {
  type: string;
  get(): string;
  set(v: string): void;
}

interface Admin extends Action, Person{
  sex: "男" | "女"
}

type PA = Person & Action & { sex: "男" | "女" };

class AdminUser implements PA{
  id = 1;
  name = "jack";
  age = 20;
  tel = "12333333";
  sex: "男" | "女" = "男";
  type = "admin";
  get() { 
    return "hello"
  }
  set(v: string) { 
    console.log(v);
  }
}

const p: PA = {
  id: 1,
  age: 20,
  name: 'ruby',
  tel:"213123123",
  sex: "男",
  type: "person",
  get() { 
    return "world";
  },
  set(v: string) {
    console.log(v)
  }
}

const adminUser = new AdminUser();
console.log(adminUser.get()); 